package cn.iocoder.yudao.module.ym.service.maputil;

import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.infra.api.maputil.dto.AreaSiteMapDto;
import cn.iocoder.yudao.module.infra.api.area.dto.AreaDto;
import cn.iocoder.yudao.module.infra.api.maputil.dto.AreaSiteNameMapDto;
import cn.iocoder.yudao.module.infra.api.site.dto.SiteDto;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
import cn.iocoder.yudao.module.ym.dal.dataobject.area.AreaDO;
import cn.iocoder.yudao.module.ym.dal.dataobject.maputil.AreaSiteUserDeptMap;
import cn.iocoder.yudao.module.ym.dal.dataobject.site.SiteDO;
import cn.iocoder.yudao.module.ym.dal.mysql.area.AreaMapper;
import cn.iocoder.yudao.module.ym.dal.mysql.site.SiteMapper;
import jakarta.annotation.Resource;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * mapUtil Service 实现类
 *
 * @author 韩艳阳
 */
@Service
@Validated
public class MapUtilServiceImpl implements MapUtilService {

    @Resource
    private SiteMapper siteMapper;

    @Resource
    private AreaMapper areaMapper;

    @Resource
    private AdminUserMapper adminUserMapper;

    @Resource
    private DeptMapper deptMapper;

    /**
     * 获取 区域 电站 用户 公司的map
     * @return
     */
    @NotNull
    public AreaSiteUserDeptMap getFourMap() {
        List<SiteDO> siteDOS = siteMapper.selectList();
        Map<Long, SiteDO> siteMap = Optional.ofNullable(siteDOS)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(siteDo -> siteDo.getId() != null)
                .collect(Collectors.toMap(
                        SiteDO::getId,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        List<AreaDO> areaDOList = areaMapper.selectList();
        Map<Long, AreaDO> areaMap = Optional.ofNullable(areaDOList)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(areaDo -> areaDo.getId() != null)
                .collect(Collectors.toMap(
                        AreaDO::getId,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        List<AdminUserDO> adminUserDOS = adminUserMapper.selectList();
        Map<Long, AdminUserDO> userMap = Optional.ofNullable(adminUserDOS)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(adminUserDO -> adminUserDO.getId() != null)
                .collect(Collectors.toMap(
                        AdminUserDO::getId,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        List<DeptDO> deptDOS = deptMapper.selectList();
        Map<Long, DeptDO> deptMap = Optional.ofNullable(deptDOS)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(deptDO -> deptDO.getId() != null)
                .collect(Collectors.toMap(
                        DeptDO::getId,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        return  new AreaSiteUserDeptMap(siteMap, areaMap, userMap,deptMap);
    }

    @Override
    public AreaSiteMapDto getTwoMap() {
        List<SiteDO> siteDOS = siteMapper.selectList();
        List<SiteDto> siteDtoList = BeanUtils.toBean(siteDOS, SiteDto.class);
        Map<Long, SiteDto> siteMap = Optional.ofNullable(siteDtoList)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(siteDto -> siteDto.getId() != null)
                .collect(Collectors.toMap(
                        SiteDto::getId,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        List<AreaDO> areaDOList = areaMapper.selectList();
        List<AreaDto> areaDtoList = BeanUtils.toBean(areaDOList, AreaDto.class);
        Map<Long, AreaDto> areaMap = Optional.ofNullable(areaDtoList)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(areaDto -> areaDto.getId() != null)
                .collect(Collectors.toMap(
                        AreaDto::getId,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        return  new AreaSiteMapDto(siteMap, areaMap);
    }

    @Override
    public AreaSiteNameMapDto getTwoMapByName() {
        List<SiteDO> siteDOS = siteMapper.selectList();
        List<SiteDto> siteDtoList = BeanUtils.toBean(siteDOS, SiteDto.class);
        Map<String, SiteDto> siteMap = Optional.ofNullable(siteDtoList)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(siteDto -> siteDto.getSiteName() != null)
                .collect(Collectors.toMap(
                        SiteDto::getSiteName,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        List<AreaDO> areaDOList = areaMapper.selectList();
        List<AreaDto> areaDtoList = BeanUtils.toBean(areaDOList, AreaDto.class);
        Map<String, AreaDto> areaMap = Optional.ofNullable(areaDtoList)
                .orElseGet(Collections::emptyList) // 处理null列表
                .stream()
                .filter(areaDto -> areaDto.getAreaName() != null)
                .collect(Collectors.toMap(
                        AreaDto::getAreaName,  // Key提取器
                        Function.identity(),  // Value提取器（对象本身）
                        (oldValue, newValue) -> oldValue  // 处理重复键：保留第一个值
                ));
        return  new AreaSiteNameMapDto(siteMap, areaMap);
    }


}
